package com.cjy.queueArray;

/**
 * @Author Giles
 * @Date 2022/6/19 15:53
 * @Version 1.0
 * 结合笔记一起看
 */
public class queue {
    /**
     * 二、单元测试 队列代码
     */
    public static void main(String[] args) {
        // 创建一个队列
        ArrayQueue arrayQueue = new ArrayQueue(3);
        // 测试对象中的方法
//        arrayQueue.showQueue();
        arrayQueue.addQueue(2);
        // 取数据的时候会报异常 所以需要用try-catch来捕获异常
        try {
            int res = arrayQueue.getQueue();
            System.out.printf("取出的数据是%d",res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


/**
 * 一、创建一个 队列对象
 */
class ArrayQueue{

    private int maxSize; // 数组的最大容量
    private int front; //队列头
    private int rear; // 队列尾
    private int[] arr ; // 这里是用数组来实现队列

    // 构造器，创建队列对象
    public ArrayQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        arr =new int[maxSize];
        // 这里是代表指针的下标用来记录队列中进入和消费的位置
        // 至于这里为什么是-1，那是因为在数组中的下标位置是0开始的，所以当添加第一个元素的时候数组的小标就是0，所以初始化位置需要是它的前一个位置也就是-1
        front = -1;
        rear = -1;
    }

    // 构建判断队列是否满的方法
    public boolean isFull(){
        return  rear == maxSize -1;
    }

    // 判断队列是否为空
    public boolean isEmpty(){
        return rear == front;
    }

    // 添加 数据到队列中
    public void addQueue(int n){
        // 1.判断队列是否已满
        if (isFull()){
            System.out.println("队列数据已满");
            return;
        }
        rear++ ; //指针后移
        arr[rear] =n;
    }

    // 获取队列的数组，也就是消费队列
    public int getQueue(){
        //非空判断
        if (isEmpty()){
            throw new RuntimeException("队列为空，无法取出数据");
        }
        front ++; //指针后移
        return arr[front];
    }

    // 显示队列的所有数据
    public void showQueue(){
        // 非空判断
        if (this.isEmpty()){
            throw new RuntimeException("队列为空，无法取出数据");
        }
        // 遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("arr[%d]=%dn",i,arr[i]);
        }
    }

    // 偷看队列中的头数据（队列中最后的数组），也就是front指针现在指向的是哪个数据
    public int peekHead(){
        // 非空判断
        if (this.isEmpty()){
            throw new RuntimeException("队列为空，无法取出数据");
        }
        // 注意这里是front+1
        return arr[front + 1];
    }

}
